// cf-429c
// 题意：给定n(<=24)的数，表示树中某个节点子树的节点个数，问是否存在
//       一个树，这个树的每个内部节点都至少有两个儿子，满足上诉条件。
//
// 题解：首先根节点子树点数为n，叶子节点子树点数为1。由于每个内部节点
//       都至少有两个儿子节点，所以叶子节点的个数大于等于(n+1)/2。
//       先将所有节点数从小到大排序，然后过滤出叶子结点，从第一个
//       内部节点开始，令dp[i][leaf][st]表示做到第i个内部节点，还
//       剩下leaf个叶子结点，当前还可以选为当前点的儿子的状态st，
//       程序里用到了一个技巧，就是
//         for (int tst = st; ; tst = st & (tst - 1));
//       这样可以枚举st中1的所有组合。
//       所以可以转移到
//         dp[i + 1][leaf - r][(st ^ tst) | (1 << i)]
//       其中r是表示选为儿子状态tst的节点和sum还不够，剩余用叶子结点来补。
//       然后要保证每个内部节点至少有两个儿子，所以要么sum+r==0或者
//       sum+r>1。
//       最后结果就是dp[inter][0][1<<(inter - 1)]，inter表示内部节点个数。
//       具体复杂度不好算，反正小于O(3^(n/2)*n^2)，主要是上面for循环的
//       复杂度不知道怎么分析，也可以用三进制表示st，0表示在st中，1表示
//       在st中不在tst中，2表示在st也在tst中。
//
//       当然这道题还有更好写的做法，就是每个节点父亲是唯一的，所以
//       可以枚举每个内部节点的父亲。
//
// run: $exec < input
#include <iostream>
#include <algorithm>
#include <vector>

int const maxn = 27;
bool dp[maxn][maxn][1 << (maxn / 2)];
int n, ni, leaf;
std::vector<int> v;

int main()
{
	std::cin >> n;
	v.resize(n);
	for (int i = 0; i < n; i++) std::cin >> v[i];
	if (n == 1) { std::cout << "YES\n"; return 0; }
	std::sort(v.begin(), v.end());
	int leaf = 0;
	for (; leaf < n; leaf++)
		if (v[leaf] != 1) break;
	if (leaf < (n + 1) / 2 || v[n - 1] != n) {
		std::cout << "NO\n";
		return 0;
	}
	int inter = n - leaf;
	dp[0][leaf][0] = true;
	for (int i = 0; i < inter; i++) {
		for (int j = 0; j <= leaf; j++) {
			for (int st = 0; st < (1 << i); st++) {
				if (!dp[i][j][st]) continue;
				for (int tst = st; ; tst = st & (tst - 1)) {
					int sum = 0, tot = 0;
					for (int t = 0; t < i; t++)
						if ((tst >> t) & 1) { sum += v[leaf + t]; tot++; }
					int need = v[leaf + i] - sum - 1;
					if (need <= j && need >= 0 && ((!(tot + need) || tot + need > 1)))
						dp[i + 1][j - need][(st ^ tst) | (1 << i)] = true;
					if (!tst) break;
				}
			}
		}
	}
	std::cout << (dp[inter][0][1 << (inter - 1)] ? "YES" : "NO") << '\n';
}

